home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / front.lha / front / src / Actions.mi < prev    next >
Text File  |  1992-08-18  |  5KB  |  190 lines

  1. (* hanlde global actions and comments *)
  2.  
  3. (* $Id: Actions.mi,v 1.5 1992/08/07 15:13:51 grosch rel $ *)
  4.  
  5. (* $Log: Actions.mi,v $
  6.  * Revision 1.5  1992/08/07  15:13:51  grosch
  7.  * allow several scanner and parsers; extend module Errors
  8.  *
  9.  * Revision 1.4  1991/12/04  16:21:41  grosch
  10.  * unified escape conventions for all tools
  11.  *
  12.  * Revision 1.3  1991/11/21  14:47:50  grosch
  13.  * new version of RCS on SPARC
  14.  *
  15.  * Revision 1.2  90/06/11  18:44:36  grosch
  16.  * layout improvements
  17.  * 
  18.  * Revision 1.1     89/01/12  18:07:10  vielsack
  19.  * line number is printed before an action is output
  20.  * 
  21.  * Revision 1.0     88/10/04  14:26:33  vielsack
  22.  * Initial revision
  23.  * 
  24.  *)
  25.  
  26. IMPLEMENTATION MODULE Actions;
  27.  
  28. FROM IO        IMPORT WriteC, WriteS, WriteI, WriteNl, tFile;
  29. FROM Lists    IMPORT MakeList, IsEmpty, Head, Tail, tList;
  30. FROM Memory    IMPORT Alloc;
  31. FROM Strings    IMPORT Char, Length, tStringIndex, tString;
  32. FROM StringMem    IMPORT GetString, tStringRef, WriteString;
  33. FROM SYSTEM    IMPORT TSIZE;
  34. FROM TokenTab    IMPORT PosType;
  35. FROM WriteTok    IMPORT tLanguage, Language, SourceFileName;
  36.  
  37.   TYPE
  38.     ElmtType = 
  39.       RECORD
  40.     Act    : tList;
  41.     ActPos    : PosType;
  42.     Comm    : tList;
  43.     CommPos : PosType;
  44.       END;
  45.  
  46.   VAR
  47.     ActionMode      : tActionMode;
  48.     KeyPos      : ARRAY tActionMode OF PosType;
  49.     Action      : ARRAY tActionMode OF ElmtType;
  50.     ActionComm      : ARRAY tActionMode OF tList;
  51.     ActionCommPos : ARRAY tActionMode OF PosType;
  52.     dummyPos      : PosType;
  53.   
  54.   PROCEDURE PutComment (kind: tActionMode; kp: PosType; c: tList; cp: PosType);
  55.     BEGIN
  56.       KeyPos [kind] := kp;
  57.       ActionComm [kind] := c;
  58.       ActionCommPos [kind] := cp;
  59.     END PutComment;
  60.  
  61.   PROCEDURE GetComment (kind: tActionMode; VAR kp: PosType; VAR c: tList; VAR cp: PosType);
  62.     BEGIN
  63.       kp := KeyPos [kind];
  64.       c     := ActionComm [kind];
  65.       cp := ActionCommPos [kind];
  66.     END GetComment;
  67.  
  68.   PROCEDURE PutAction (kind: tActionMode; a: tList; ap: PosType; c: tList; cp: PosType);
  69.     BEGIN
  70.       WITH Action [kind] DO
  71.     Act := a;
  72.     ActPos := ap;
  73.     Comm := c;
  74.     CommPos := cp;
  75.       END;
  76.     END PutAction;
  77.  
  78.   PROCEDURE GetAction (kind: tActionMode; VAR a: tList; VAR ap: PosType; VAR c: tList; VAR cp: PosType);
  79.     BEGIN
  80.       WITH Action [kind] DO
  81.     a  := Act;
  82.     ap := ActPos;
  83.     c  := Comm;
  84.     cp := CommPos;
  85.       END;
  86.     END GetAction;
  87.  
  88.   PROCEDURE WriteActions (kind: tActionMode; f: tFile; Line: BOOLEAN);
  89.     BEGIN
  90.       IF Action [kind].ActPos.Line # 0 THEN
  91.     IF Language = Modula2 THEN
  92.       WriteS (f, '(* line ');
  93.       WriteI (f, Action [kind].ActPos.Line, 0);
  94.       WriteS (f, ' "');
  95.       WriteS (f, SourceFileName);
  96.       WriteS (f, '" *)');
  97.       WriteNl (f);
  98.     ELSE (* Language = C *)
  99.       IF Line THEN
  100.          WriteS (f, '# line ');
  101.          WriteI (f, Action [kind].ActPos.Line, 1);
  102.          WriteS (f, ' "');
  103.          WriteS (f, SourceFileName);
  104.          WriteC (f, '"');
  105.          WriteNl (f);
  106.       ELSE
  107.          WriteS (f, '/* line ');
  108.          WriteI (f, Action [kind].ActPos.Line, 1);
  109.          WriteS (f, ' "');
  110.          WriteS (f, SourceFileName);
  111.          WriteS (f, '" */');
  112.          WriteNl (f);
  113.       END;
  114.     END;
  115.       END;
  116.       WriteSemanticAction (f, Action [kind].Act, 0);
  117.     END WriteActions;
  118.  
  119.   PROCEDURE WriteSemanticAction (f: tFile; a: tList; t: CARDINAL);
  120.   VAR
  121.     c : CHAR;
  122.     s : tString;
  123.     i : tStringIndex;
  124.     i1, i2 : tStringIndex;
  125.     Delimiter : CHAR;
  126.     
  127.     PROCEDURE Tab;
  128.       BEGIN
  129.     FOR i := 1 TO t DO
  130.       WriteC (f, ' ');
  131.       WriteC (f, ' ');
  132.     END;
  133.       END Tab;
  134.  
  135.     BEGIN
  136.       i1 := 2;    (* Erstes Zeichen des ersten Strings ist Randbegrenzung *)
  137.       WHILE NOT IsEmpty (a) DO
  138.     GetString (tStringRef (Head (a)), s);
  139.     Tail (a);
  140.     i2 := Length (s);
  141.     IF IsEmpty (a) THEN
  142.       DEC (i2);  (* letztes Zeichen des letzten Strings ist Randbegrenzung *)
  143.     END;
  144.     Tab;
  145.     i := i1;
  146.     WHILE i <= i2 DO
  147.       c := Char (s, i); INC (i);
  148.       IF c = '\' THEN
  149.         WriteC (f, Char (s, i)); INC (i);
  150.       ELSIF (c = '"') OR (c = "'") THEN
  151.         Delimiter := c;
  152.         WriteC (f, c);
  153.         REPEAT
  154.           c := Char (s, i); INC (i);
  155.           WriteC (f, c);
  156.           IF (Language = C) AND (c = '\') THEN
  157.             WriteC (f, Char (s, i)); INC (i);
  158.           END;
  159.         UNTIL c = Delimiter;
  160.       ELSE
  161.         WriteC (f, c);
  162.       END;
  163.     END;
  164.     i1 := 1;
  165.       END;
  166.       WriteNl (f);
  167.     END WriteSemanticAction;
  168.  
  169.     PROCEDURE WriteStringList (file: tFile; slist: tList);
  170.       BEGIN
  171.     WHILE NOT IsEmpty (slist) DO
  172.       WriteString (file, tStringRef (Head (slist)));
  173.       Tail (slist);
  174.     END;
  175.       END WriteStringList;
  176.  
  177. BEGIN
  178.   dummyPos.Line := 0;
  179.   dummyPos.Column := 0;
  180.   FOR ActionMode := MIN (tActionMode) TO MAX (tActionMode) DO
  181.     KeyPos [ActionMode]        := dummyPos;
  182.     MakeList (ActionComm [ActionMode]);
  183.     ActionCommPos [ActionMode]    := dummyPos;
  184.     MakeList (Action [ActionMode].Act);
  185.     Action [ActionMode].ActPos    := dummyPos;
  186.     MakeList (Action [ActionMode].Comm);
  187.     Action [ActionMode].CommPos := dummyPos;
  188.   END;
  189. END Actions.
  190.